package design_pattern.proxy.demo;

import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

/**
 * @version 1.0.0
 * Created by cyd on 2024-07-29 17:15:20
 * @ClassName : design_pattern.proxy.demo.TestDemo
 * @Description : 类描述
 */
public class TestDemo {
    @Test
    public void test() {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        System.out.println(list.size());
    }

    @Test
    public void test2() {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);

        List proxyList = (List) Proxy.newProxyInstance(TestDemo.class.getClassLoader(),
                new Class[]{List.class},
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // method 调用的方法  args调用的参数
                        // 对功能进行拦截
                        if (method.getName().equals("remove")) {
                            System.out.println("拦截阻止了remove方法");
                            return null;
                        }
                        // 统计时间（增强）
                        long start = System.currentTimeMillis();
                        // 使用代理的target作为调用invoke的对象
                        Object invokeResult = method.invoke(list, args);
                        long end = System.currentTimeMillis();
                        System.out.println(method.getName() + " 耗时：" + (end - start));
                        return invokeResult;
                    }
                });
        System.out.println(list);
        proxyList.add(3);
        proxyList.remove(0);
        System.out.println(list);
    }
}
